#include "LRUCache.h"
#include <iostream>

LRUCache::LRUCache(int capacity): _capacity(capacity){

}

LRUCache::LRUCache(const LRUCache &cache)
: _capacity(cache._capacity), _resultList(cache._resultList), _pendingUpdateList(cache._pendingUpdateList){
    for(auto it = _resultList.begin(); it != _resultList.end(); it++){
        _hashMap[it->first] = it;
    }
}

LRUCache & LRUCache::operator=(const LRUCache &rhs){
    if (this != &rhs) {
        _capacity = rhs._capacity;
        _resultList = rhs._resultList;
        _pendingUpdateList = rhs._pendingUpdateList;
        _hashMap.clear();
        for (auto it = _resultList.begin(); it != _resultList.end(); ++it) {
            _hashMap[it->first] = it;
        }
    }
    return *this;
}

LRUCache::~LRUCache(){

}

//从缓冲中获取元素
string LRUCache::getElement(const string &key){
    /* lock_guard<mutex> lock(_mutex); */
    auto it = _hashMap.find(key);
    if (it == _hashMap.end()) {
        return ""; // 没有找到元素
    }
    // 将元素移动到链表头部
    _resultList.splice(_resultList.begin(), _resultList, it->second);
    _pendingUpdateList.push_back(_resultList.front());
    return it->second->second;
}

//向缓存中添加元素
void LRUCache::addElement(const string &key, const string &value){
    auto it = _hashMap.find(key);
    if(it != _hashMap.end()){
        // 元素已存在，更新其值并移动到链表头部
        it->second->second = value;
        _resultList.splice(_resultList.begin(), _resultList, it->second);
    }
    else{
        // 元素不存在，检查缓存是否已满
        if((int)_resultList.size() >= _capacity){
            // 移除链表尾部的元素
            auto last = _resultList.back();
            _hashMap.erase(last.first);
            _resultList.pop_back();
        }
        // 插入新元素到链表头部
        _resultList.push_front({key, value});
        _hashMap[key] = _resultList.begin();
    }
    _pendingUpdateList.push_back(_resultList.front());    
}

//从磁盘读取缓存
void LRUCache::readFromFile(const string &filename){

}

//将缓存写入磁盘
void LRUCache::writeToFile(const string &filename){

}

//每隔一段时间更新缓存
void LRUCache::update(const LRUCache &rhs){
    _capacity = rhs._capacity;
    _resultList = rhs._resultList;
    _pendingUpdateList.clear();
    _hashMap.clear();
    for(auto it = _resultList.begin(); it != _resultList.end(); it++){
        _hashMap[it->first] = it;
    }
}

//获取缓存的更新信息
list<pair<string, string>> &LRUCache::getPendingUpdateList(){
    /* lock_guard<mutex> lock(_mutex); */
    /* cout << "lock3" << endl; */
    return _pendingUpdateList;
}

//打印缓存
void LRUCache::print(){
    for(auto &i: _resultList){
        cout << i.first << ": " << i.second << endl;
    }
}

/* //缓存的容量 */
/* int _capacity; */
/* //保存缓存的键值对 */
/* list<pair<string, string>> _resultsList; */
/* //等待更新的节点信息 */
/* list<pair<string, string>> _pendingUpdateList; */
/* //unordered_map保存键和其对应的迭代器，以实现对list的常数时间访问 */
/* unordered_map<int, list<pair<string, string>>::iterator> _hashMap; */
